【小ネタ】Pythonで書いたLambda関数からnullしか返ってこない時の対処法
どうも、福岡のmeです。
今回はLambdaからDynamoDBのデータを取得するというシンプルな実装をしていたのですが、
嵌りどころがあったので同じことが繰り返されぬよう静かにここに書き記しておきます。
やろうとしていたこと
Lambda関数からDynamodbへアクセスし、データを取得
環境
Python 3.6 + Boto3
問題のコード
必要な処理を
getUsers()
内に書きLambda_handlerから呼び出すような形で実装していました。
import boto3 import os from boto3.dynamodb.conditions import Key, Attr from botocore.exceptions import ClientError dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(os.environ['DB_TABLE_NAME']) def getUsers(event, context): group_id = event["group_id"] try: items = table.scan( FilterExpression=Attr('group_id').eq(group_id) ) except ClientError as e: print(e.response['Error']['Message']) else: print("GetItem SUCCESS:") print(items) # -> データの取得はできている return items[‘Items’] #-> null? def lambda_handler(event, context): getUsers(event, context)
21行目のprint()ではデータが取れているのにも関わらずresponse はnullです。
解決策
Lambda_handlerからメソッドを呼び出すだけでは
自動的にメソッドから返る値を返してくれないことがわかりました。
return をつけることで無事にデータを取得することができました。
import boto3 import os from boto3.dynamodb.conditions import Key, Attr from botocore.exceptions import ClientError dynamodb = boto3.resource('dynamodb') table = dynamodb.Table(os.environ['DB_TABLE_NAME']) def getUsers(event, context): group_id = event["group_id"] print('group_id: ' + group_id) try: items = table.scan( FilterExpression=Attr('group_id').eq(group_id) ) print('Items: ') print(items) # return users except ClientError as e: print(e.response['Error']['Message']) else: print("GetItem 成功!:") print(items) return items['Items'] def lambda_handler(event, context): return getUsers(event, context)
無事にデータを取得することができました。